perm filename BIGVIX.SAI[VIS,HPM]1 blob
sn#279948 filedate 1977-05-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1MAP,PIC2MAP
C00008 00003 PROCEDURE FINDIN(REFERENCE INTEGER PICMAP INTEGER WINDOWSIZE
C00013 00004 INTEGER PROCEDURE RSIZE(INTEGER HIG,WID,BIT REFERENCE INTEGER NORD)
C00019 ENDMK
C⊗;
REAL PROCEDURE SEARCH(REFERENCE INTEGER PIC1MAP,PIC2MAP;
INTEGER WINDOWSIZE;
REFERENCE REAL POSY,POSX;
REAL DY1(0),DX1(0),DY2(1),DX2(1) );
COMMENT applies the binary search correlation method to find a window
centered about POSX,POSY in PIC1 (defined to be 0 to 1 in X and Y),
and of size WINDOWSIZE pixels square in the whole of PIC2. PIC1MAP
and PIC2MAP are an array of starting addresses of successively
reduced versions of the pictures. The best match in PIC2 is returned
in POSX and POSY, the value of the match (0 to 1) is the value of SEARCH.
The search can be constrained to the rectangle bounded by DY1,DX1,
DY2,DX2 (all 0 to 1) if desired;
BEGIN
INTEGER IL,JL,IH,JH,WID,HIG,NORD,I,J,K,L,M,N; REAL QUAL;
REAL PXF,PYF;
INTEGER ILT,JLT,IHT,JHT,
ILS,JLS,IHS,JHS,
ISC,JSC,ITC,JTC,
ISS,JSS,ITS,JTS;
REAL QUALT,PXFT,PYFT;
INTEGER PROCEDURE TRYRED(INTEGER MS,MT);
BEGIN
INTEGER ANS,LEV;
ANS←-1;
IF QUALT<.8 THEN
BEGIN
REAL PXFTT,PYFTT,QUALTT,QUATTT;
INTEGER WISH; BOOLEAN LOSE;
ISC←(ISS←MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]+PCLN])*POSY;
JSC←(JSS←MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]+LNBY])*POSX;
ITC←(ITS←MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]+PCLN])*PYF;
JTC←(JTS←MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]+LNBY])*PXF;
WISH←WINDOWSIZE; QUALTT←0; LEV←-1;
DO
BEGIN
LOSE←TRUE;
WISH←WISH%2; LEV←LEV+1;
JLS←JSC-WISH;
ILS←ISC-WISH;
JHS←JSC+WISH;
IHS←ISC+WISH;
JLT←(JTC-WINDOWSIZE) MAX (JTS*DX1-WISH-1);
ILT←(ITC-WINDOWSIZE) MAX (ITS*DY1-WISH-1);
JHT←(JTC+WINDOWSIZE) MIN (JTS*DX2+WISH+1);
IHT←(ITC+WINDOWSIZE) MIN (ITS*DY2+WISH+1);
QUATTT←NORCOR(MEMORY[MEMORY[LOCATION(PIC1MAP)+MS]],ILS,JLS,IHS,JHS,
MEMORY[MEMORY[LOCATION(PIC2MAP)+MT]],ILT,JLT,IHT,JHT);
LITEN;
DPYUP(SYNMAP(0));
IF QUATTT>QUALTT THEN
BEGIN
PXFTT←0.5*(JLT+JHT+0.5)/JTS;
PYFTT←0.5*(ILT+IHT+0.5)/ITS;
QUALTT←QUATTT;
LOSE←FALSE;
END;
END
UNTIL QUALTT≥.65 ∨ WISH≤3 ∨ LOSE;
SETFORMAT(0,3);
IF QUALTT>QUALT THEN
BEGIN
QUALT←QUALTT;
PXFT←PXFTT;
PYFT←PYFTT;
ANS←LEV;
END;
RETURN(ANS);
END;
END;
IF DX1>DX2 THEN DX1↔DX2;
IF DY1>DY2 THEN DY1↔DY2;
IF DX1≥1∨DX2≤0∨DY1≥1∨DY2≤0 THEN RETURN(0);
DX1←DX1 MAX 0; DX2←DX2 MIN 1; DY1←DY1 MAX 0; DY2←DY2 MIN 1;
WID←MEMORY[PIC1MAP+LNBY]*ABS(DX2-DX1);
HIG←MEMORY[PIC1MAP+PCLN]*ABS(DY2-DY1);
NORD←0;
WHILE WINDOWSIZE≤(WID MIN HIG)/2↑(NORD+1) DO NORD←NORD+1;
PXF←(DX1+DX2)/2; PYF←(DY1+DY2)/2;
QUAL←1;
FOR M←NORD STEP -1 UNTIL 0 DO
BEGIN
INTEGER TR;
QUALT←-1.0;
TR←TRYRED(M,M);
IF TR<0 ∨ M=0 THEN M←0 ELSE
IF M-TR>0 THEN M←M-TR
ELSE
BEGIN
WINDOWSIZE←WINDOWSIZE ASH -(TR-M+1);
M←1;
END;
PXF←PXFT;
PYF←PYFT;
QUAL←QUAL MIN QUALT;
END;
POSX←PXF; POSY←PYF;
RETURN(QUAL);
END;
PROCEDURE FINDIN(REFERENCE INTEGER PICMAP; INTEGER WINDOWSIZE;
REFERENCE INTEGER NFS; REFERENCE REAL FY,FX);
BEGIN
INTEGER IORD,HIG,WID,BIT,IW,HW;
IORD←0; WHILE (WINDOWSIZE ASH -(IORD+1))≥2 DO IORD←IORD+1;
IW←WINDOWSIZE ASH -IORD;
HW←(IW+1)%2;
IW←2*HW;
HIG←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+PCLN];
WID←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+LNBY];
BIT←MEMORY[MEMORY[LOCATION(PICMAP)+IORD]+BYBI];
BEGIN
INTEGER IAV,I,J,K,AH,AW,FHAV,AWR,AHR;
SAFE INTEGER ARRAY
INTER[ 0 : AH ← (HIG-HW-1)%IW + (HIG-1)%IW - 1,
0 : AW ← (WID-HW-1)%IW + (WID-1)%IW - 1 ];
REAL ARRAY FXV,FYV,FIV[1:NFS];
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I00[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-1)%IW-1];
IAV←INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I00[0,0],0,0);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2,J*2]←I00[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I10[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-1)%IW-1];
IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I10[0,0],HW,0);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2+1,J*2]←I10[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I01[-2:AH←(HIG-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I01[0,0],0,HW);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2,J*2+1]←I01[I,J];
END;
BEGIN
INTEGER AH,AW;
SAFE INTEGER ARRAY I11[-2:AH←(HIG-HW-1)%IW-1, 0:AW←(WID-HW-1)%IW-1];
IAV←IAV+INTOP(MEMORY[MEMORY[LOCATION(PICMAP)+IORD]],IW,I11[0,0],HW,HW);
FOR I←0 STEP 1 UNTIL AH DO
FOR J←0 STEP 1 UNTIL AW DO
INTER[I*2+1,J*2+1]←I11[I,J];
END;
IAV←IAV%32;
INTLOM(AH+1,AW+1,INTER[0,0]); comment flag local maxima;
FHAV←0;
FOR I←1 STEP 1 UNTIL AH-2 DO
FOR J←1 STEP 1 UNTIL AW-1 DO
IF (INTER[I,J] LAND 1)=1 ∧ INTER[I,J]>IAV THEN
BEGIN
REAL FXT,FYT,FIT;
INTEGER L,H,M;
FYT←((I+1)*HW+.5)/HIG;
FXT←((J+1)*HW+.5)/WID;
FIT←INTER[I,J];
L←1; H←FHAV;
WHILE L≤H DO IF FIT>FIV[M←(L+H)%2] THEN H←M-1 ELSE L←M+1;
FHAV←(FHAV+1) MIN NFS;
IF L≤FHAV THEN
BEGIN
FOR M←FHAV-1 STEP -1 UNTIL L DO
BEGIN
FXV[M+1]←FXV[M]; FYV[M+1]←FYV[M]; FIV[M+1]←FIV[M];
END;
FXV[L]←FXT; FYV[L]←FYT; FIV[L]←FIT;
END;
END;
FOR I←1 STEP 1 UNTIL FHAV DO
BEGIN
MEMORY[LOCATION(FX)-1+I,REAL]←FXV[I];
MEMORY[LOCATION(FY)-1+I,REAL]←FYV[I];
END;
NFS←FHAV;
END;
END;
INTEGER PROCEDURE RSIZE(INTEGER HIG,WID,BIT; REFERENCE INTEGER NORD);
BEGIN
INTEGER TSIZ,I;
TSIZ←PIXDIM(HIG,WID,BIT);
I←WID MIN HIG; NORD←0;
WHILE I>2 DO
BEGIN
NORD←NORD+1; I←I ASH -1;
TSIZ←TSIZ+PIXDIM(HIG ASH -NORD,WID ASH -NORD,(BIT+2*NORD) MIN 9);
END;
RETURN(TSIZ);
END;
PROCEDURE RDUCE(REFERENCE INTEGER M; REFERENCE INTEGER P);
BEGIN
INTEGER HIG,WID,BIT,I,J,II;
MEMORY[LOCATION(M)+0]←LOCATION(P);
HIG←MEMORY[MEMORY[LOCATION(M)+0]+PCLN];
WID←MEMORY[MEMORY[LOCATION(M)+0]+LNBY];
BIT←MEMORY[MEMORY[LOCATION(M)+0]+BYBI];
J←PIXDIM(HIG,WID,BIT);
II←WID MIN HIG; I←1; II←II ASH -1;
WHILE II>2 DO
BEGIN
II←II ASH -1;
MEMORY[LOCATION(M)+I]←LOCATION(P)+J;
J←J+PIXDIM(HIG ASH -I,WID ASH -I,(BIT+2*I) MIN 9);
HAFPIC(MEMORY[MEMORY[LOCATION(M)+I-1]],MEMORY[MEMORY[LOCATION(M)+I]],9);
I←I+1;
END;
END;